package com.plugin;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;

public class ResourceDirCreator {
    private static final ClassLoader classLoader;

    static {
        classLoader = ResourceDirCreator.class.getClassLoader();
    }

    /**
     * 在当前模块的resources目录下创建指定文件夹
     * @param dirNames 要创建的文件夹名称，支持多个
     */
    public static void createResourceDirs(String... dirNames) {
        try {
            // 获取当前类所在的资源目录路径
            URL resourceUrl = classLoader.getResource("");
            
            if (resourceUrl == null) {
                System.err.println("无法获取资源目录，请检查项目结构");
                return;
            }
            
            // 转换为文件路径
            File resourceDir = new File(resourceUrl.toURI());
            System.out.println("当前资源目录: " + resourceDir.getAbsolutePath());
            
            // 逐个创建目录
            for (String dirName : dirNames) {
                File targetDir = new File(resourceDir, dirName);
                if (!targetDir.exists()) {
                    boolean created = targetDir.mkdirs();
                    if (created) {
                        System.out.println("成功创建目录: " + targetDir.getAbsolutePath());
                    } else {
                        System.err.println("创建目录失败: " + targetDir.getAbsolutePath());
                    }
                } else {
                    System.out.println("目录已存在: " + targetDir.getAbsolutePath());
                }
            }
            
        } catch (URISyntaxException e) {
            System.err.println("资源路径解析错误: " + e.getMessage());
        } catch (Exception e) {
            System.err.println("创建目录时发生错误: " + e.getMessage());
        }
    }

    public static File findResourcesFile(String subprojectName, String fileName) {
        Path resourcesPath = getResourcesPath(subprojectName);
        if (resourcesPath == null) {
            System.err.println("路径不存在");
            return null;
        }
        Path resolve = resourcesPath.resolve(fileName);
        return resolve.toFile();
    }

    public static Path getResourcesPath(String subprojectName) {
        try {
            URL classUrl = classLoader.getResource(ResourceDirCreator.class.getName().replace(".", "/") + ".class");
            if (classUrl == null) {
                System.err.println("无法获取类路径，无法定位项目结构");
                return null;
            }

            // 从类路径解析到子项目的源代码资源目录
            File classFile = new File(classUrl.toURI());
            Path basePath = classFile.toPath();

            // 寻找子项目的src/main/resources目录（适用于Maven/Gradle标准结构）
            // 通常编译后的class文件路径为：子项目/target/classes/... 或 子项目/build/classes/...
            return findSubprojectResourceDir(basePath, subprojectName);
        } catch (Exception e) {
            System.err.println("路径解析错误：" + e.getMessage());
        }
        return null;
    }

    /**
     * 在子项目的src/main/resources目录下创建指定文件夹
     * @param subprojectName 子项目名称（如"PluginDemoV2"）
     * @param dirNames 要创建的文件夹名称
     */
    public static void createSubprojectResourceDirs(String subprojectName, String... dirNames) {
        try {
            Path resourceDir = getResourcesPath(subprojectName);
            if (resourceDir == null) {
                System.err.println("未找到子项目[" + subprojectName + "]的src/main/resources目录");
                return;
            }

            // 创建目标目录
            for (String dirName : dirNames) {
                Path targetDir = resourceDir.resolve(dirName);
                if (Files.notExists(targetDir)) {
                    Files.createDirectories(targetDir);
                    System.out.println("已在子项目资源目录创建：" + targetDir.toAbsolutePath());
                } else {
                    System.out.println("子项目资源目录已存在：" + targetDir.toAbsolutePath());
                }
            }

        } catch (IOException e) {
            System.err.println("目录创建失败：" + e.getMessage());
        }
    }

    /**
     * 从类文件路径反向查找子项目的src/main/resources目录
     */
    private static Path findSubprojectResourceDir(Path classFilePath, String subprojectName) {
        // 向上遍历目录，寻找子项目根目录
        Path current = classFilePath;
        while (current != null) {
            // 检查当前目录是否为子项目根目录（包含src/main/resources结构）
            Path candidate = current.resolve(subprojectName)
                    .resolve("src")
                    .resolve("main")
                    .resolve("resources");

            if (Files.exists(candidate) && Files.isDirectory(candidate)) {
                return candidate;
            }

            // 检查另一种可能的目录结构（class文件直接在子项目的target目录下）
            candidate = current.resolve("src")
                    .resolve("main")
                    .resolve("resources");
            if (Files.exists(candidate) && Files.isDirectory(candidate) &&
                    current.getFileName().toString().equals(subprojectName)) {
                return candidate;
            }

            current = current.getParent();
        }
        return null;
    }
}
